問題描述
System.Reflection.Assembly.LoadFile 鎖定文件 (System.Reflection.Assembly.LoadFile Locks File)
I'm loading a DLL
via System.Reflection.Assembly.LoadFile
and reflecting over it's members in a plugin-esque system. I need to be able to update/overwrite these DLL
while the system is running but it appears that after calling System.Reflection.Assembly.LoadFile
the file is subsequently locked. Does anyone know of a way to unlock the file? I have read about loading the file in a separate appdomain? Are there any pitfalls to this approach?
參考解法
方法 1:
If you use this:
System.Reflection.Assembly.Load(System.IO.File.ReadAllBytes(path))
It will not lock the file.
Edit
While this works, it is not the best solution, but the better way of doing it is a lot more involved (too much for just pasting all the code here for it).
I have created a public repository on Github here with all the code for doing this properly:
Loading Assemblies without Locking by using Shadow Copying.
方法 2:
Use Microsoft.Cci included in Microsoft FxCop
Sample for version 1.35:
using Microsoft.Cci;
// [...]
AssemblyNode assembly = AssemblyNode.GetAssembly(path);
(by Adam Naylor、Pondidum、Sven Hecht)